RegExp এর মধ্যে Recursion এবং উদাহরণ

Backreferences এবং Recursion - জাভাস্ক্রিপ্ট রেগএক্সপি (Javascript RegExp) - Web Development

298

Recursion হল একটি কনসেপ্ট যেখানে একটি ফাংশন বা পদ্ধতি নিজেকে পুনরায় কল করে। সাধারণভাবে, recursion এর প্রয়োগ সাধারণ প্রোগ্রামিং ভাষায় দেখা যায়, তবে JavaScript এর RegExp (রেগুলার এক্সপ্রেশন) এর মধ্যে recursion করা কিছুটা সীমিত। তবে, RegExp তে recursion করার জন্য বিশেষ কিছু ট্রিকস এবং প্যাটার্ন ব্যবহার করা যায়, যেগুলি মূলত ফাংশনাল প্যাটার্ন রিকাশন হিসেবে কাজ করে।

RegExp তে recursion সাধারণভাবে নির্দিষ্ট প্যাটার্নের পুনরাবৃত্তি বা স্মল প্যাটার্নস খোঁজার ক্ষেত্রে ব্যবহৃত হতে পারে।


RegExp এ Recursion এবং Nested Patterns

JavaScript এর RegExp এ সরাসরি recursion সমর্থিত নয় (যেমন একটি প্যাটার্ন নিজেই তার ভিতরে নিজেকে কল করতে পারে না)। তবে, কিছু নির্দিষ্ট প্যাটার্নের মাধ্যমে recursive-like আচরণ সৃষ্টির জন্য যথাযথ grouping এবং নেস্টেড প্যাটার্ন ব্যবহার করা যেতে পারে।

RegExp এ Recursive-like behavior সাধারনত (?<name>pattern) বা Named Capture Groups এবং Backreference এর মাধ্যমে অর্জিত হতে পারে।


উদাহরণ: Balanced Parentheses Matching (Balanced Brackets)

একটি সাধারণ উদাহরণ যেখানে Recursion-like behavior ব্যবহার করা হয়, তা হল Balanced Parentheses Matching। এখানে, আমরা চেষ্টা করব একটি RegExp দিয়ে খুঁজে বের করতে, যে কোন স্ট্রিংটি সঠিকভাবে প্যারেন্টেসিস দ্বারা গঠন করা হয়েছে কিনা।

আমরা এটি একটি Recursive RegExp এর মতো তৈরি করতে পারি, যা ইনভলভ করবে গ্রুপিং এবং ব্যাকরেফারেন্স।

প্যাটার্ন:

let regex = /^(?:(\((?:[^()]*|(?R))*\))|[^()])*$/;

এখানে,

  • (?R) প্যাটার্নটি recursive reference এর মতো কাজ করে এবং এটি নিজেই প্যাটার্নের মধ্যে পুনরাবৃত্তি করে।
  • \( এবং \) প্যাটার্নটি প্যারেন্টেসিস খোলার এবং বন্ধ করার জন্য ব্যবহৃত হয়।
  • (?:[^()]*|(?R)) এই অংশটি বলছে, "যেকোনো ক্যারেক্টার যা প্যারেন্টেসিস নয়, অথবা রিকার্সিভভাবে প্যাটার্নের ভিতরে থাকতে পারে।"

উদাহরণ ১: প্যারেন্টেসিসের মধ্যে সঠিকভাবে মেলানো স্ট্রিং

let regex = /^(?:(\((?:[^()]*|(?R))*\))|[^()])*$/;
let str1 = "(a(b)c)";
console.log(regex.test(str1));  // true

এখানে, প্যাটার্নটি (a(b)c) স্ট্রিংটির মধ্যে সঠিকভাবে মেলানো প্যারেন্টেসিস খুঁজে পায়, এবং true রিটার্ন করে।

উদাহরণ ২: ভুলভাবে মেলানো প্যারেন্টেসিস

let regex = /^(?:(\((?:[^()]*|(?R))*\))|[^()])*$/;
let str2 = "(a(b(c))";
console.log(regex.test(str2));  // false

এখানে, স্ট্রিংটি ভুলভাবে প্যারেন্টেসিস খোলার কারণে, প্যাটার্নটি এটি সঠিকভাবে মেলাতে পারে না এবং false রিটার্ন করবে।


RegExp এ Recursion-এর সীমাবদ্ধতা

যদিও আমরা Named Capture Groups এবং Backreferences ব্যবহার করে recursive-like behavior তৈরি করতে পারি, তবুও JavaScript এর RegExp সঠিকভাবে গণনা বা পদ্ধতিগত recursion সমর্থন করে না। এ কারণে এটি কিছু ক্ষেত্রে অত্যন্ত জটিল প্যাটার্ন তৈরি করা বা গভীর recursion প্রয়োগ করতে সীমাবদ্ধ।

  • JavaScript এর RegExp-এ Direct Recursion সমর্থন নেই, যেমন একটি প্যাটার্ন নিজেই তার ভিতরে নিজেকে কল করতে পারে না।
  • Backreferences শুধুমাত্র পূর্ববর্তী গ্রুপগুলোই রেফারেন্স করতে পারে, কিন্তু কোনো গ্রুপের পুনরাবৃত্তি স্বয়ংক্রিয়ভাবে ঘটানোর সুযোগ নেই।

সারাংশ

RegExp-এ Recursion সরাসরি সমর্থিত না হলেও, Named Capture Groups এবং Backreferences এর মাধ্যমে আমরা recursive-like behavior তৈরি করতে পারি। এর মাধ্যমে কিছু নির্দিষ্ট প্যাটার্নের মধ্যে পুনরাবৃত্তি করা যায়, যেমন Balanced Parentheses Matching উদাহরণের মতো। তবে JavaScript এর RegExp তে সরাসরি recursion প্রয়োগে কিছু সীমাবদ্ধতা রয়েছে।

Content added By
Promotion

Are you sure to start over?

Loading...